package cn.jingyuan.swan.system.service;

import cn.jingyuan.swan.system.domain.sys.entity.Authority;
import cn.jingyuan.swan.system.enums.SysAuthorityTypeEnum;
import cn.jingyuan.swan.system.model.SimpleAuthority;
import cn.jingyuan.swan.system.model.dto.AuthorityApiDto;
import cn.jingyuan.swan.system.model.dto.AuthorityResourceDto;

import java.util.Collection;
import java.util.Date;
import java.util.List;

/**
 * 系统权限服务
 */
public interface AuthorityService {

    /**
     * 保存或修改权限
     *
     * @param resourceId 资源 id
     * @param resourceType 资源类型
     *
     * @return 权限
     */
    Authority saveOrUpdateAuthority(Long resourceId, SysAuthorityTypeEnum resourceType);

    /**
     * 授权用户权限
     *
     * @param
     * @param userId 用户ID
     * @param expireTime 过期时间,null表示长期,不限制
     * @param authorityIds 权限集合
     *
     * @return 权限标识
     */
    // FIXME 返回值
    void grantAuthoritys(Long userId, Date expireTime, String... authorityIds);

    /**
     * 应用授权-添加单个权限
     *
     * @param appId
     * @param expireTime
     * @param authorityId
     */
    // FIXME 返回值
    void addAuthorityApp(String appId, Date expireTime, String authorityId);

    /**
     * 角色授权
     *
     * @param roleId 角色 id
     * @param expireTime 过期时间,null表示长期,不限制
     * @param authorityIds 权限集合
     *
     * @return 权限标识
     */
    // FIXME 返回值
    void addAuthorityRole(Long roleId, Date expireTime, String... authorityIds);

    /**
     * 应用授权
     *
     * @param
     * @param appId 应用ID
     * @param expireTime 过期时间,null表示长期,不限制
     * @param authorityIds 权限集合
     *
     * @return
     */
    // FIXME 返回值
    void addAuthorityApp(String appId, Date expireTime, String... authorityIds);

    /**
     * 移除权限
     *
     * @param resourceId 资源 id
     * @param resourceType 资源类型
     */
    void removeAuthority(Long resourceId, SysAuthorityTypeEnum resourceType);

    void removeAuthorityApp(String appId);

    void removeUserAuthority(Long userId, Long authorityId);

    /**
     * 清理无效权限
     *
     * @param serviceId 服务 id
     * @param codes
     */
    void clearInvalidApi(String serviceId, Collection<String> codes);

    /**
     * 是否已被授权
     *
     * @param resourceId 资源 id
     * @param resourceType 资源类型
     *
     * @return true：已授权，false：未授权
     */
    Boolean isGranted(Long resourceId, SysAuthorityTypeEnum resourceType);

    /**
     * 检测全是是否被多个角色授权
     *
     * @param authorityId
     * @param roleIds
     *
     * @return
     */
    Boolean isGrantedByRoleIds(String authorityId, Long... roleIds);

    /**
     * 获取权限
     *
     * @param resourceId 资源 id
     * @param resourceType 资源类型
     *
     * @return 权限
     */
    Authority getAuthority(Long resourceId, SysAuthorityTypeEnum resourceType);

    /**
     * 获取应用已授权权限
     *
     * @param appId
     *
     * @return
     */
    List<SimpleAuthority> findAuthorityByApp(String appId);

    /**
     * 获取角色已授权权限
     *
     * @param roleId
     *
     * @return
     */
    List<SimpleAuthority> findAuthorityByRole(Long roleId);

    /**
     * 获取用户已授权权限
     *
     * @param userId
     *
     * @return
     */
    List<SimpleAuthority> findAuthorityByUser(Long userId);

    /**
     * 获取开放对象权限
     *
     * @param type = null 查询全部  type = 1 获取菜单和操作 type = 2 获取API
     *
     * @return
     */
    List<SimpleAuthority> findAuthorityByType(String type);

    /**
     * 获取访问权限列表
     */
    List<AuthorityResourceDto> findAuthorityResource();

    /**
     * 获取 Api 权限列表
     *
     * @param serviceId 服务 id
     *
     * @return Api 权限列表
     */
    List<AuthorityApiDto> findAuthorityApi(String serviceId);


}
